﻿/* 对  象 ：CListItem
// 功  能 ：列表项
// 属  性 ：
//	m_oElement       - 容器
//	m_oItemData      - 附加项
//	m_oListView      - 绑定ListView
// 参  数 ：
//	vDivItem         - 容器
*/
function CListItem(vDivItem)
{
	this.m_oElement          = vDivItem;
	this.m_oItemData         = null;
	this.m_oListView         = null;
}

/* 函  数 ：AttachElement
// 功  能 ：附加元素
// 参  数 ：
//	vDivItem         - 
// 返回值 ：
*/
CListItem.prototype.AttachElement=function(vDivItem)
{
    this.m_oElement  = domGetElementCur(vDivItem);	
}


/* 函  数 ：SetImage
// 功  能 ：
// 参  数 ：
//	strUrl           - 
// 返回值 ：
*/
CListItem.prototype.SetImage=function(strUrl)
{

}

/* 函  数 ：SetText
// 功  能 ：
// 参  数 ：
//	strText          - 
// 返回值 ：
*/
CListItem.prototype.SetText=function(strText)
{
    this.SetHtml(strText);
}

/* 函  数 ：SetHtml
// 功  能 ：
// 参  数 ：
//	strHtml          - 
// 返回值 ：
*/
CListItem.prototype.SetHtml=function(strHtml)
{
    var oElement = null;
    
    if(this.m_oElement!=null)
    {
        if(this.m_oElement.innerHTML!="")
            domSetHtml("", this.m_oElement);
        oElement =  domAppendHtml(strHtml, this.m_oElement);
    }
    
    return oElement;
}







//=================================================================================
/* 对  象 ：CSelListItem
// 功  能 ：
// 属  性 ：
//	m_nSelWay        - 选择状态方式
//	                    = 0 : html内部属性 <div sel="1" />
//	                    = 1 : 使用变量 m_bSelState = tru
//	m_bSelState      - 内部选中状态
// 参  数 ：
//	nSelWay          - 选择状态方式
//	                    = 0 : html内部属性 <div sel="1" />
//	                    = 1 : 使用变量 m_bSelState = tru
*/
//=================================================================================
function CSelListItem(vDivItem)
{
	CListItem.call(this, vDivItem);	
	this.m_bSelState         = false;
}
CSelListItem.prototype = new CListItem();



/* 函  数 ：SetStyle
// 功  能 ：设置样式
// 参  数 ：
//	nStyleType       - 不同状态样式：
//	                    = 0 : 未选中,鼠标不在上
//	                    = 1 : 未选中,鼠标  在上
//	                    = 2 :   选中,鼠标不在上
//	                    = 3 :   选中,鼠标  在
// 返回值 ：
*/
CSelListItem.prototype.SetStyle=function(nStyleType)
{
    var oElement = this.m_oElement;
    if(nStyleType<0 || nStyleType>3)
        return;

    var strStyle = this.m_oListView.GetListItemStyle(nStyleType);    
    if(strStyle!="")
        domSetStyleValue2(oElement, strStyle);
}

/* 函  数 ：SetCurStyleByMouse
// 功  能 ：根据当前鼠标位置设置样式
// 参  数 ：
//	bOver            - 鼠标是否在上面
// 返回值 ：
*/
CSelListItem.prototype.SetCurStyleByMouse=function(bOver)
{
    var  n = 0;        
    var bSel = this.GetSelectState();
    
    if(bOver)
        n = bSel ? 3 : 1;
    else
        n = bSel ? 2 : 0;
        
    this.SetStyle(n);
}


/* 函  数 ：InitMouseEvent
// 功  能 ：注册鼠标事件
// 参  数 ：
// 返回值 ：
*/
CSelListItem.prototype.InitMouseEvent=function()
{
   if(this.m_oElement==null)
        return;
        
    var oElement = this.m_oElement;
    var _this_   = this;
    
    //-判断样式:是否鼠标放上就选中-
    var bMouseSel = false;
    var oListView = this.m_oListView;
    if(oListView!=null && oListView.m_bMouseSel!=undefined)
        bMouseSel = oListView.m_bMouseSel;
        
    oElement.onclick = function()
    {        
        //-调用事件-
        if(oListView.m_fnItemClickSet!=null && oListView.m_fnItemClickSet.length>0)
        {
            for(var i=0; i<oListView.m_fnItemClickSet.length; i++)
            {
                oListView.m_fnItemClickSet[i](_this_);
            }
        }
        
        _this_.SetSelectState(2, true);
    } 
    
    oElement.onmouseover = function()
    {
        if(bMouseSel)
            _this_.SetSelectState(1,true);
        else
            _this_.SetCurStyleByMouse(true);
    }
    
    oElement.onmouseout = function()
    {
        _this_.SetCurStyleByMouse(false);
    }     
    
    oElement.onmousedown = function(ev)
    {
    	var e = ev || window.event;
        
    }
}

/* 函  数 ：SetSelectState
// 功  能 ：设置选中状态
// 参  数 ：
//	nState           - 取值如下:
//	                    = 0 ：      未选中
//	                    = 1 ：        选中
//	                    = 2 : 切换选中状
//	bMouseOver       - 是否鼠标在上
//	                   将根据此状态来设置样
// 返回值 ：返回最终选择状态
*/
CSelListItem.prototype.SetSelectState=function(nState, bMouseOver)
{
    var oElement = this.m_oElement;
    if(oElement==null)
        return -1;
    
    var bSel = false;
    switch(nState)
    {
        case 0 :  
        case false:     bSel =  false; break;
        case 1 :          
        case true:      bSel =  true;  break;        
        default:        bSel =  !this.GetSelectState();
    }
    
    //-取消其余选择状态-
    if(bSel)  
    {
        var oListView = this.m_oListView;
        if(oListView && !oListView.m_bMulSel)
        {
            var oSelListItemSet = oListView.GetSelectListItemSet(true);
            for(var i=0; i<oSelListItemSet.length; i++)
            {
                oSelListItemSet[i].SetSelectState(0);
                oSelListItemSet[i].SetStyle(0);
            }
        }
    }
    
    //-设置当前状态-
    this.m_bSelState = bSel;
    
    //-设置样式-
    this.SetCurStyleByMouse(bMouseOver==undefined?false:bMouseOver);
    
     return this.GetSelectState();
}

/* 函  数 ：GetSelectState
// 功  能 ：获取选中状态
// 参  数 ：
// 返回值 ：
*/
CSelListItem.prototype.GetSelectState=function()
{
    var oElement = this.m_oElement;
    if(oElement==null)
        return -1;
        
    return this.m_bSelState;
}




//=================================================================================
/* 对  象 ：CListView
// 功  能 ：列表控件
// 属  性 ：
//	m_oDivElement    - 对应元素
//	m_bItemHr        - listitem是否水平滚动
//	                   =true : 水平向滚动，垂直向固定
//	                   =false: 垂直向滚动，水平向固
//	m_strItemClass   - 列表项对应的类，
//	                   缺省为CListIte
//	m_strTemplateItem - 列表项对应模板
//	m_bMulSel        - 是否多选
//	m_bMouseSel      - 是否鼠标放上就选中
//	m_fnItemClickSet - item on click event
//	m_oListItemSet   - 保存的listitem集合
// 参  数 ：
//	vDivListView     - 对应元素
//	bHr              - listitem是否水平滚动
//	                   =true : 水平向滚动，垂直向固定
//	                   =false: 垂直向滚动，水平向固
//	strItemClass     - 列表项对应的类，
//	                   缺省为CListItem
*/
//=================================================================================
function CListView(vDivListView, bHr, strItemClass)
{
	this.m_oDivElement       = domGetElementCur(vDivListView);
	this.m_bItemHr           = bHr==undefined ? true : bHr;
	this.m_strItemClass      = strItemClass==undefined?"CSelListItem":strItemClass;
	this.m_strItemStyleName  = this.m_bItemHr ? "O2ListItem_HR" : "O2ListItem_VR";
	this.m_strTemplateItem   = '<div class="' + this.m_strItemStyleName + '"></div>';
	this.m_bMulSel           = false;
	this.m_bMouseSel         = false;
	this.m_fnItemClickSet    = null;
	this.m_oListItemSet      = [];	
	        	
	//-itemstyle-
	this.m_strItemStyleSet   = [    "background-color:''" ,
	                                "background-color: #FFCC80" ,
	                                "background-color: blue" ,
	                                "background-color: blue" 
	                           ];
}


/* 函  数 ：GetListItemStyle
// 功  能 ：获取listItemStyle
// 参  数 ：
//	nStyleType       - 不同状态样式：
//	                    = 0 : 未选中,鼠标不在上
//	                    = 1 : 未选中,鼠标  在上
//	                    = 2 :   选中,鼠标不在上
//	                    = 3 :   选中,鼠标  在
// 返回值 ：样式值
*/
CListView.prototype.GetListItemStyle=function(nStyleType)
{
    var str = "";
    if(nStyleType>=0 && nStyleType<=3)
        str = this.m_strItemStyleSet[nStyleType];
    return str;
}

/* 函  数 ：SetListItemStyle
// 功  能 ：设置listitemStyle
// 参  数 ：
//	nStyleType       - 不同状态样式
//	strStyle         - 样式值
// 返回值 ：
*/
CListView.prototype.SetListItemStyle=function(nStyleType, strStyle)
{
    if(nStyleType>=0 && nStyleType<=3)
        this.m_strItemStyleSet[nStyleType] = strStyle;
}

/* 函  数 ：ChangeSelectItem
// 功  能 ：根据当前选中项通过偏移改变选中项；
//          如果当前选中项没有，缺省选中第0
// 参  数 ：
//	nStep            - 偏移数，正负均可
// 返回值 ：
*/
CListView.prototype.ChangeSelectItem=function(nStep)
{
    var nCount = this.GetCount();
    if(nCount<=0)
        return 0;
        
    //-获取当前选择的-
    var nIndex = this.GetCurSelItem(false);
    
    //-如果没有选中的,选中第一个-
    if(nIndex<0)
    {
        this.SetCurSelItem(0);
        return 1;
    }
    
    //-切换选中项-
    var nNewIndex = nIndex + nStep;
    if(nNewIndex>=0 && nNewIndex<nCount)
    {
        this.SetCurSelItem(nNewIndex);
        return 1;
    }
    
    return 0;
}


/* 函  数 ：InitKeyEvent
// 功  能 ：注册鼠标键盘事件
// 参  数 ：
// 返回值 ：
*/
CListView.prototype.InitKeyEvent=function()
{
   if(this.m_oDivElement==null)
        return;
        
    var _this_   = this;
    var oElement = _this_.m_oDivElement;
          
    oElement.onkeyup = function(ev)
    {
        var e = ev || window.event;
        switch(e.keyCode)
        {
            case 38: _this_.ChangeSelectItem(-1); break; //Up
            case 40: _this_.ChangeSelectItem(1);  break; //Down
            case 13: break;                              //Enter
        } 
    }
}

/* 函  数 ：AttachEvent
// 功  能 ：注册事件
// 参  数 ：
//	strEventName     - 事件名
//	fnEvent          - 函数名
// 返回值 ：
*/
CListView.prototype.AttachEvent=function(strEventName, fnEvent)
{
    if(strEventName=="itemclick")
    {
        if(this.m_fnItemClickSet==null)
            this.m_fnItemClickSet = [];
        this.m_fnItemClickSet.push(fnEvent);    
    }
}

/* 函  数 ：GetListItemFromIndex
// 功  能 ：从索引获取listItem对象
// 参  数 ：
//	nIndex           - 索引
// 返回值 ：
*/
CListView.prototype.GetListItemFromIndex=function(nIndex)
{   
    if(nIndex==undefined)
        return null;
        
    if(nIndex<0 || nIndex>=this.m_oListItemSet.length)
        return null;
        
    return this.m_oListItemSet[nIndex];
}

/* 函  数 ：GetIndexFromListItem
//功  能 ：从listItem对象获取索引
//参  数 ：
//	oListItem        - 
//返回值 ：
*/
CListView.prototype.GetIndexFromListItem=function(oListItem)
{
	if(oListItem==null)
        return -1;
        
	for(var i=0; i<this.m_oListItemSet.length; i++)    
	{
		if(this.m_oListItemSet[i]==oListItem)
			return i;
	}
        
    return -1;
}

/* 函  数 ：GetListItemFromItemData
//功  能 ：从ItemData获取listitem对应的索引
//参  数 ：
//	vItemData        - 对应元素
//	bGetListItem     - 返回结果类型
//	                   = true：返回ListItem对象
//	                   = false：    返回数组索引
//	                   
//返回值 ：
*/
CListView.prototype.GetListItemFromItemData=function(vItemData, bGetListItem)
{
	var oLast =  bGetListItem==true? null : -1;
    
    for(var i=0; i<this.m_oListItemSet.length; i++)    
    {
        if(this.m_oListItemSet[i].m_oItemData==vItemData)
        {
            oLast =  bGetListItem==true? this.m_oListItemSet[i] : i;
            break;
        }
    }
    
    return oLast;
}

/* 函  数 ：GetListItemFromDomElement
// 功  能 ：从htm dom element获取listitem对应的索引
// 参  数 ：
//	vItemElement     - 对应元素
// 返回值 ：
*/
CListView.prototype.GetListItemFromDomElement=function(vItemElement, bGetListItem)
{
   var oLast =  bGetListItem==true? null : -1;
    
    var oLastElement = domGetElementCur(vItemElement);
    for(var i=0; i<this.m_oListItemSet.length; i++)    
    {
        if(this.m_oListItemSet[i].m_oElement==oLastElement)
        {
            oLast =  bGetListItem==true? this.m_oListItemSet[i] : i;
            break;
        }
    }
    
    return oLast;
}

/* 函  数 ：CreateListItem
// 功  能 ：创建临时ListItem对象
// 参  数 ：
//	oItemElement     - 
// 返回值 ：
*/
CListView.prototype.CreateListItem=function(oItemElement)
{
    var oListItem = null;
    var strTemplate = "oListItem = new {0}(oItemElement, 1);";
    var strValue = strTemplate.format(this.m_strItemClass);
    eval(strValue);
    oListItem.m_oListView=this;
    return oListItem;   
}


/* 函  数 ：AddListItem
// 功  能 ：创建Item
// 参  数 ：
// 返回值 ：返回创建的Item
*/
CListView.prototype.AddListItem=function()
{
    if(this.m_oDivElement==null)
        return null;
        
    //- 创建-
    var oItemElement = domAppendHtml(this.m_strTemplateItem, this.m_oDivElement);
    if(oItemElement==null)
        return null;
        
    //- 返回listitem
    var oListItem = this.CreateListItem(oItemElement);        
    if(oListItem)
    {
        oListItem.InitMouseEvent();

        this.m_oListItemSet.push(oListItem);
    }
    
    return oListItem;
}

/* 函  数 ：DelListItem
// 功  能 ：删除单个Item
// 参  数 ：
//	nIndex           - 
// 返回值 ：
*/
CListView.prototype.DelListItem=function(vIndex)
{
	var oListItem = null;
	var nIndex = -1;
	if(typeof(vIndex) == "object")
	{
		oListItem = vIndex;
		if(oListItem)
			nIndex = this.GetIndexFromListItem(oListItem);
	}
	else
	{
		nIndex = vIndex;
		if(nIndex>=0)
			oListItem = this.GetListItemFromIndex(vIndex);
	}
    if(oListItem==null)
        return 0;
        
   //-删除界面-
    var oItemElement = oListItem.m_oElement;
    domDeleteElement(oItemElement);
           
   //-删除数组-
   this.m_oListItemSet = this.m_oListItemSet.slice(0, nIndex).concat(this.m_oListItemSet.slice(nIndex+1,this.m_oListItemSet.length));
       
   return 1;  
}

/* 函  数 ：DelListItemSet
// 功  能 ：删除多个item
// 参  数 ：
//	oListItemSet     - 
// 返回值 ：
*/
CListView.prototype.DelListItemSet=function(oListItemSet)
{
    for(var i=oListItemSet.length-1; i>=0; i--)   
    {
        this.DelListItem(oListItemSet[i]);
    }
}

/* 函  数 ：Clear
// 功  能 ：清除所有Item
// 参  数 ：
// 返回值 ：
*/
CListView.prototype.Clear=function()
{
    var nCount = this.m_oListItemSet.length;
    if(nCount<=0)
        return 0;
        
    //-删除界面-
    for(var i=nCount-1; i>=0; i--)
    {
        var oItemElement = this.m_oListItemSet[i].m_oElement;
        domDeleteElement(oItemElement);
    }
               
   //-删除数组-
   this.m_oListItemSet.length = 0;    
   return 1;
}

/* 函  数 ：GetSelectItemList
// 功  能 ：获取选中的列表项
// 参  数 ：
//	bGetListItem     - 返回结果类型
//	                   = true ：    返回ListItem对象
//	                   = false：    返回数组索引
//	                   
// 返回值 ：
*/
CListView.prototype.GetSelectListItemSet=function(bGetListItem)
{
    var oRtnItems = [];    
    var oListItem    = null;    
    for(var i=0; i<this.m_oListItemSet.length; i++)
    {
        oListItem = this.m_oListItemSet[i];
        if(oListItem.GetSelectState())
        {
            oRtnItems.push(bGetListItem==true?oListItem:i);
        }
    }
       
    return oRtnItems;
}


/* 函  数 ：GetCurSelectListItem
// 功  能 ：获取鼠标点击处元素
// 参  数 ：
//	e                - 
//	bGetListItem     - 返回结果类型
//	                   = true：返回ListItem对象
//	                   = false：    返回数组索引
//	                   
// 返回值 ：当前listItem对象
//          =null 没有
//          若保存，返回索引
//          若不保存，返回htmldomelemen
*/
CListView.prototype.GetCurSelectListItem=function(e,bGetListItem)
{
    //-通过向上追溯父节点是否为ListView判定ListItem
    var oTarget = msGetEventTarget(e);        
    var oTargetLast = null;    
    while(1)
    {
        if(oTarget==null)
            break;
        
        if(oTarget==this.m_oDivElement)  
            break;
        
        oTargetLast = oTarget;
        oTarget = oTarget.parentNode;        
    }
    if(oTargetLast==null)
        return null;

    //-判断是否为ListItem-
    var oListItem = null;
    var nIndex = -1;
    if(oTargetLast!=null)
    {        
        nIndex = this.GetListItemFromDomElement(oTargetLast, false);
        if(nIndex>=0)    
            oListItem = this.GetListItemFromIndex(nIndex);
    }
    
    //-判断是否选中-    
    if(oListItem && oListItem.GetSelectState()==false)
        oListItem = null;

	return bGetListItem==true?oListItem:nIndex;
}

/* 函  数 ：GetCount
// 功  能 ：获取总数
// 参  数 ：
// 返回值 ：
*/
CListView.prototype.GetCount=function()
{
    return this.m_oListItemSet.length;
}

/* 函  数 ：GetListItem
//功  能 ：获取某个ListItem
//参  数 ：
//	nIndex           - 
//返回值 ：
*/
CListView.prototype.GetListItem=function(nIndex)
{
	return this.m_oListItemSet[nIndex];
}

/* 函  数 ：GetCurSelItem
// 功  能 ：获取当前选中项
// 参  数 ：
//	bGetListItem     - 返回结果类型
//	                   = true：返回ListItem对象
//	                   = false：    返回数组索引
//	                   
// 返回值 ：
*/
CListView.prototype.GetCurSelItem=function(bGetListItem)
{      
    var nSelIndex    = -1;
    var oSelListItem = null;    
    var oListItem    = null;
    for(var i=0; i<this.m_oListItemSet.length; i++)
    {
        oListItem = this.m_oListItemSet[i];
        if(oListItem.GetSelectState())
        {
            oSelListItem = oListItem;
            nSelIndex = i;
            break;    
        }
    }
       
    return bGetListItem? oSelListItem : nSelIndex;
}


/* 函  数 ：SetCurSelItem
// 功  能 ：设置当前选中项
// 参  数 ：
//	nIndex           - 
// 返回值 ：
*/
CListView.prototype.SetCurSelItem=function(nIndex)
{
    var oItemList = this.GetListItemFromIndex(nIndex);
    if(oItemList==null)
        return 0;
        
    oItemList.SetSelectState(1);    
	return nIndex;
}